<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		变量作用域及内存
	</body>
	<script>
		
		/**2动态类型的不同*/
		/**引用类型*/
		var box =new Object();//或者 var box ={};
		box.name ='lee';//添加一个属性
		alert(box.name);//lee
		
		/**基本数值类型*/
		var box2 ='joy';//基本数值类型，字符串
		box2.age='28';//
		alert(box2.age);//undefined
		
		/**3基本类型和引用类型的复制*/
		
		var student ={};//引用类型保存在堆内存
		student.name='tom';
		var student2 =student;//student和student2都是在栈内存中不同指针，但是指向同一个堆内存的值
		alert(student.name);	//tom
		alert(student2.name);//tom
		//当修改其中一个值是另一个也被修改了
		student2.name="jock";
		alert(student.name);	//jock
		alert(student2.name);//jock
		
		//基本类型互不影响，值保存在栈内存'
		var box3 ='xiaoming';
		var box4 =box3;
		box4 ='xiaohong'; 
		alert(box3);//xiaoming
		alert(box4);//xiaohong
		
		/**4传递参数（都是按值传递）*/
		
		function  toal(num){//按值传递
			num+=10;   //局部变量
			return num
		}
		var num =50;  //全局变量
		alert(toal(num));//60
		alert(num);//50
		
		function ss(obj){//这里传入引用类型参数，实际按值传递
			obj.name='是按值传递';
			var obj = new Object(); //这里只是局部
			obj.name='是引用传递'; //并没有覆盖
			
		}
		var obj = new Object();
		ss(obj);
		alert(obj.name);//是按值传递
		
		/**5检查类型typeof 在检查基本数据类型是好用但是检测引用类型是不好用了
		 * 要使用instanceof检查引用类型，但是不能用instanceof检查基本类型返回false*/
		var box5 =[1,2,3];//数组
		alert(typeof box5) ; //object
		alert(box5 instanceof Array);//true
		var box6 ={};//对象
		alert(typeof box6);//object
		alert(box6 instanceof Object);//true
		var box7 =/g/;//正则表达式
		alert(typeof box7);//object
		alert(box7 instanceof RegExp);//true
		
		
		var box8 ='lee';//基本数据类型，字符串
		var box9 =new String('lee');//引用类型
		alert(typeof box8) ;//String
		alert(typeof box9) ;//object
		alert(box8 instanceof String);//false
		alert(box9 instanceof String);//true
		
		//5执行环境及作用域
		
		var name ='lee';
		function setName(name){//传参也是局部的
			var name='Tom';//局部变量
			name ="jok";  //全局变量
			
			//return setColor();//返回内部函数
			function setColor(){//局部，作用域在setName
				var b='setColor'; //作用域在setColor
				return 456;
			}
			return 123;
		}
		alert(name);//jok
		alert(setName('传参'));//123
		
		alert(window.name);//jok   全局变量，最外围属于window属性
		alert(window.setName('传参'));//123 全局变量，最外围属于window方法
		  
		  
		  //6没有块级作用域，
		  if(true){
		  	var temp = '块级内';   //是全局
		  }
		  for(var i=0;i<10;i++){
		  	var temp2 =10;    //同样也是全局
		  }
		  alert(temp);//
		  alert(window.temp);//
		  alert(temp2);
		  
	</script>
</html>
